package com.hsp.demo_10.codeblock;

public class Demo_06 {
    public static void main(String[] args) {
//        Dog dog = new Dog();
        /*
        输出：
            1、Animal的构造器Animal()
            2、Dog普通代码块
            3、Dog的构造器Dog
         总结：
            super() -> super类的普通代码块 -> super类的构造器 —> 本类普通代码块 -> 本类构造器

            如果没有实例化，只是加载：
                先加载父类，再加载子类
                    静态(代码块， 成员，变量)
            如果是实例化，不过已经加载过了：
                先实例化父类，再实例化子类：
                    成员（代码块，方法，变量） -> 构造器
            如果实例化，但是也是类加载：
                先加载父类，再加载本类：
                    静态（代码块、成员、变量） -> 成员（代码块、方法、变量） -> 构造器
         */

        Dog dog = new Dog();
        /*
        打印结果：
            先加载，父类 再 子类：
                Animal的静态变量
                Animal的静态代码块

                Dog的静态变量
                Dog的静态代码块

             再实例化 先父类， 再子类：
                Animal的成员变量
                Animal的普通代码块
                Animal的构造器Animal()

                Dog的成员变量
                Dog的普通代码块
                Dog的构造器Dog()
         */
    }
}

class Animal{

    public static int count = getCount();
    public int size = getSize();
    static{
        System.out.println("Animal的静态代码块");
    }

    {
        System.out.println("Animal的普通代码块");
    }

    public Animal(){
        //super()
        //本类普通代码块
        System.out.println("Animal的构造器Animal()");
    }

    public static int getCount(){
        System.out.println("Animal的静态变量（类变量）");
        return 1;
    }

    public int getSize(){
        System.out.println("Animal的成员变量");
        return 1;
    }
}

class Dog extends Animal{

    public static int otherC = getOtherc();

    public  int otherS = getOtherS();

    static{
        System.out.println("Dog的静态代码块");
    }

    {
        System.out.println("Dog的普通代码块");
    }

    public Dog(){
        //1、super()
        //2、普通代码块
        System.out.println("Dog的构造器Dog()");
    }

    public static int getOtherc(){
        System.out.println("Dog的静态变量");
        return 1;
    }

    public int getOtherS(){
        System.out.println("Dog的成员变量");
        return 1;
    }
}